#禁用默认按键：
Remove-PSReadlineKeyHandler 'Ctrl+r' 

# posh-git 模块配置
## 安装 Install-Module posh-git -Scope CurrentUser
## 导入模块posh-git
Import-Module posh-git
## 配置
## - 设置目录地址使用~替代
$GitPromptSettings.DefaultPromptAbbreviateHomeDirectory = $true
#$GitPromptSettings.DefaultPromptWriteStatusFirst = $true

#$GitPromptSettings.DefaultPromptBeforeSuffix.Text = '`n$([DateTime]::now.ToString("MM-dd HH:mm:ss"))'
#$GitPromptSettings.DefaultPromptSuffix = ' $((Get-History -Count 1).id + 1)$(">" * ($nestedPromptLevel + 1)) '

$GitPromptSettings.BeforePath = '['
$GitPromptSettings.AfterPath = ']'
$GitPromptSettings.BeforePath.ForegroundColor = 'Green'
$GitPromptSettings.AfterPath.ForegroundColor = 'Green'
$GitPromptSettings.DefaultPromptPath.ForegroundColor = 'Orange'
#$GitPromptSettings.DefaultPromptPath.ForegroundColor = 0xFFA500

## - 颜色设置
$GitPromptSettings.DefaultPromptPrefix.Text = '$(Get-Date -f "MM-dd HH:mm:ss") '
$GitPromptSettings.DefaultPromptPrefix.ForegroundColor = [ConsoleColor]::Magenta
#$GitPromptSettings.DefaultPromptBeforeSuffix.ForegroundColor = 0x808080
#$GitPromptSettings.DefaultPromptBeforeSuffix.ForegroundColor = 'Green'
## - 换行
$GitPromptSettings.DefaultPromptBeforeSuffix.Text = '`n'


# oh-my-posh 模块配置
## 安装 Install-Module oh-my-posh -Scope CurrentUser
## 导入oh-my-posh
# Import-Module oh-my-posh
# Get-PoshThemes  # 查看所有主题
# Set-PoshPrompt -Theme JanDeDobbeleer
# Set-PoshPrompt -Theme robbyrussell
# Set-PoshPrompt -Theme Paradox
# Set-PoshPrompt -Theme amro

## 安装字体
#scoop bucket add nerd-fonts
#scoop install SarasaGothic-SC           # 安装更纱黑体（简体中文）
#scoop install Wenquanyi-Microhei    # 安装文泉驿微米黑
#scoop install Wenquanyi-Zenhei       # 安装文泉驿正黑
# 或者去下载 https://www.nerdfonts.com/font-downloads
# 解压后 点击 选择位所以用户安装 打开设置
# 对于Windows Terminal修改settings.json中的"fontFace"项为Nerd字体即可，注意要更改为其显示的正式名称；
# windows powershell --》字体–》调整字号，最后保存即可

# PSReadLine 模块配置
#Get-PSReadLineOption         # 显示所有可以配置的选项
#Get-PSReadLineKeyHandler     # 显示所有可以配置的快捷键
Set-PSReadlineKeyHandler -Key Tab -Function Complete            # Tab自动补全
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
#Set-PSReadLineKeyHandler -Key "Ctrl+d" -Function MenuComplete
Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward

# 安装： Install-Module -Name PSReadLine -AllowClobber -Force
Import-Module PSReadLine
# 启用预测 IntelliSense 
#（预测性 IntelliSense 是对 Tab 键补全概念的补充，可帮助用户成功补全命令。 它使用户能够基于用户的历史记录和其他特定于域的插件中的匹配预测来发现、编辑和执行完整命令。）
Set-PSReadLineOption -PredictionSource History
# 自定义键绑定
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward

# PSFzf 模块配置
# [GitHub - kelleyma49/PSFzf: A PowerShell wrapper around the fuzzy finder fzf](https://github.com/kelleyma49/PSFzf)
## 安装 Install-Module PSFzf -Scope CurrentUser
## 安装旧版本：Install-Module -Name PSFzf -RequiredVersion 2.0.0
## 导入 PSFzf
Import-Module PSFzf
# 设置变量值
$env:FZF_DEFAULT_OPTS ="--height=50% --layout=reverse --inline-info"
# 初始时打开历史目录选择
#Set-Location (Get-ChildItem . -Recurse | ? { $_.PSIsContainer } | Invoke-Fzf)
# 启用选项卡扩展支持
Set-PSFzfOption -TabExpansion

## 使用fzf作为Tab补全菜单
#Set-PSReadLineKeyHandler -Key Tab -ScriptBlock { Invoke-FzfTabCompletion }
Set-PSReadLineKeyHandler -Key "Ctrl+d" -ScriptBlock { Invoke-FzfTabCompletion }

# example command - use $Location with a different command:
#$commandOverride = [ScriptBlock]{ param($Location) Write-Host $Location }
# pass your override to PSFzf:
#Set-PsFzfOption -AltCCommand $commandOverride

## 用您喜欢的绑定替换 'Ctrl+t' 和 'Ctrl+r'：Ctrl+r默认通过 PSReadline 历史反向搜索
## 设置 PsFzf 的历史记录和文件查找器键盘快捷键
Set-PSFzfOption -PSReadlineChordProvider 'Ctrl+t' -PSReadlineChordReverseHistory 'Ctrl+r'


# 安装z.lua : scoop install z.lua (如果中间安装失败，去 用户目录下的 C:\Users\用户名\scoop/app/z.lua)
# Invoke-Expression (& { (lua C:\Users\whoami\scoop\apps\z.lua\current\z.lua --init powershell) -join "`n" })
# Invoke-Expression (& { (lua  .\scoop\apps\z.lua\current\z.lua --init powershell) -join "`n" })
# Invoke-Expression (& { (lua  C:\Users\iamx\scoop\apps\z.lua\current\z.lua --init powershell) -join "`n" })
# Invoke-Expression (& { (lua  $home\scoop\apps\z.lua\current\z.lua --init powershell) -join "`n" })
# Invoke-Expression (& { (lua  C:\Users\VvV\scoop\apps\z.lua\current\z.lua --init powershell) -join "`n" })
# Invoke-Expression (& { (lua  C:\Users\ThinkPad\scoop\apps\z.lua\current\z.lua --init powershell) -join "`n" })
Invoke-Expression (& { (lua C:\Tools\z.lua-1.8.13\z.lua --init powershell) -join "`n" })

# z.lua 快捷用法
# 回到历史路径，用 fzf 进行历史路径操作
function  zh {
    z -I -t .
}
# 使用交互式选择模式
function  zi {
    z -i
}
# 使用 fzf 对多个结果进行选择
function  zl {
    z -l
}
# 快速回到父目录
function  zb {
    z -b
}



# 自定义命令
# 自定义方程LSC，数列形式展示文件
function lsc {
    Param ([int]$c = 5)
    ls | Format-Wide -Column $c -Property Name
}

#function GitLogPretty {
function glp {
  git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all
}

function  vimf {
    #vim $(fzf --height=60% --preview 'ls -alh {}')
    Get-ChildItem . -Recurse -Attributes !Directory | Invoke-Fzf | % { vim $_ }
}

function  nvimf {
    # nvim $(fzf --height=60% --preview 'ls -alh {}')
    Get-ChildItem . -Recurse -Attributes !Directory | Invoke-Fzf | % { nvim $_ }
}

# 使用cd fd fzf 查找与切换目录
# 使用cd fd fzf 查找与切换目录
function  cdf {
  # cd $(fd -t d  | fzf )
  # 管道传入fzf出现中文乱码
  # 取巧办法 控制面板-> 区域 -> 设置UTF-8
  #fdfzf | cd
  # 需要建立一个fdfzf.bat脚本 内容为 fd -t d | fzf 并将其加入系统环境变量中
   
  # PSFzf下
   Get-ChildItem . -Recurse -Attributes Directory | Invoke-Fzf | Set-Location
}

## 终端命令行查英语单词
# function  {}
function  fanyi {
    declare q="$*";
    #curl --user-agent curl "https://v2en.co/${q// /%20}";
    curl --user-agent curl "https://d.supjohn.com/${q// /%20}";

}


## 找出桌面上一个星期以上（大于或者等于8天）没有访问过的文件，
# [自定义供日常使用的PowerShell脚本模块 - 知乎](https://zhuanlan.zhihu.com/p/429002760)
function Get-OldFiles {
    # 获取桌面上所有的文件信息
    $all_files = Get-ChildItem $env:USERPROFILE\Desktop -Recurse -File

    # 循环文件信息，返回其文件名，路径，以及没有访问的天数
    foreach ($file in $all_files) {
        $not_access_day = ((Get-Date) - $file.LastAccessTime).Days
        if ($not_access_day -ge 8) {
            $value = [PSCustomObject] @{
                Name          = ""
                NotAccessDays = 0
                Path          = ""
            }
            $value.Name = $file.Name
            $value.Path = $file.FullName
            $value.NotAccessDays = $not_access_day
            Write-Output $value
        }
    }
}

# Utilities
function which ($command) {
  Get-Command -Name $command -ErrorAction SilentlyContinue |
    Select-Object -ExpandProperty Path -ErrorAction SilentlyContinue
}
function touch($name){
  if ($name) {
    $file_path = Split-Path -Path $name
    $file_name = Split-Path -Path $name -Leaf
    if ($file_path -eq "") {
      $file_path = "."
    }
    if (-Not (Test-Path($file_path))) {
      New-Item -ItemType "directory" -Path $file_path
    }
    New-Item -Path $file_path -Name $file_name -ItemType "file"
  }
  else {
     Write-Host "Command to create new file."
  }
}

# m3u8 下载
#function  devm3u8() {
#    if($args.Count -eq 0)
#    {
#        "No argument!"
#    }
#    else
#    {
#        $args | foreach {"Hello,$($_)"}
#
# For($i=0;$i -lt $args.Count; $i++)
# {
#   Write-Host "parameter $i : $($args[$i])"
# }
#    }
#}

function  m3u8dl($videoname , $m3u8url) {
    # echo  "this is a test m3u8dl" 
    # echo $videoname
    # echo $m3u8url
    echo  "N_m3u8DL-RE --tmp-dir=$HOME/Downloads --save-dir=$HOME/Downloads --save-name=$videoname $m3u8url"
    N_m3u8DL-RE --tmp-dir=$HOME/Downloads --save-dir=$HOME/Downloads --save-name=$videoname $m3u8url
}

# [Releases · nilaoda/N_m3u8DL-RE · GitHub](https://github.com/nilaoda/N_m3u8DL-RE/releases)

# 批量合并文件夹下的m3u8的下载视频ts
function  multiple-ffmpeg-merge-ts($folder_path) {
  # 切换路径
  cd  $folder_path
  # 查看当前目录下所有的mp4后缀的文件
  Get-ChildItem ./ -Include *.mp4 -recurse > ./1.txt
  # 遍历
  For($i=0;$i -lt $_.Count; $i++) {
    Write-Host "parameter $i : $($_[$i])"
  }

  # 读取生成的*-file.txt 合并视频
}

function fast-ffmpeg-merge($findPath){
  # 切换路径
  cd  $findPath
  # Get-ChildItem . -Include *.mp4 -recurse > ./1.txt
  # -Recurse * 用于从指定路径开始递归地获取所有文件和文件夹。通过使用通配符*，可以获取路径下的所有项。
  # where{!$_.PSIsContainer} ，用于找出不是文件夹的文件。它将返回在当前路径下所有不是文件夹的文件。
  #$fileList = Get-ChildItem $findPath -Include *.mp4  -Recurse
  $fileList = Get-ChildItem  -Include *.mp4  -Recurse
  echo "[Debug] fileList = $fileList ";
  # 遍历
  foreach($file in $fileList) {
    $fileName = $file.name
    echo "[Debug] fileName = $fileName";
    # -split '\s+'-它被一个或多个空格分割。
    # (...)[1]然后，使用索引[1]返回第二项（因为数组索引是zero-based)）。
    $newFileName =( $fileName -split  '[0-9]+.mp4' )[0]
    echo "[Debug] newFileName= $newFileName";
    $saveFilePath="$newFileName"+"-file.txt"
    #echo "[Debug] saveFilePath= $saveFilePath";
    echo "$saveFilePath" > $saveFilePath ;
    # 先清空文件确保不会有已存在的内容
    Clear-Content  $saveFilePath  # 删除文件中的所有内容。 不删除这些文件，但它们为空。
    # 遍历
    foreach($file1 in $fileList) {
      # -match 'rdp'-首先与rdp匹配，一旦获得匹配，
      $flagStatus = $file1 -match $newFileName
      #echo "[Debug] flagStatus = $flagStatus ";
      if ( $flagStatus ) {
        #echo "T"
        echo "file  '$file1'" >> $saveFilePath
      } else {
        echo "F"
      }
    }
  }

  
  # 读取生成的*-file.txt 合并视频
  $txtFileList = Get-ChildItem  -Include *.txt  -Recurse
  foreach($txtFile in $txtFileList ) {
    # -match 'rdp'-首先与rdp匹配，一旦获得匹配，
    $flagStatus = $txtFile -match '-file.txt'
    echo "[Debug] flagStatus = $flagStatus ";
    if ( $flagStatus ) {
      # echo "T"
      $prjName =( $txtFile.name -split  '-file.txt' )[0]
      echo "prjName  = $prjName "
      # 执行开始合并命令
      # ffmpeg   -allowed_extensions ALL -protocol_whitelist -f concat -safe 0  -i $txtFile  -c copy   -vcodec lib264 "$prjName"+".mp4"
      ffmpeg  -f concat  -i  "$txtFile"  -c copy   "$prjName"+".mp4"
      # 使用ffmpeg进行多个视频合并过程中出现了“unsafe file name”错误，解决的办法是加个-safe 0 参数
      # 删除 txt文件
      # Remove-Item $txtFile   -recurse  # -recurse 参数绕过确认提示
    } else {
      echo "F"
    }
  }

}

# 关于ffmpeg Invalid data found when processing input错误
# ffmpeg库不支持，例如ffmpeg -i 1.mkv -vcodec lib264 2.mp4，你想转码成264进行输出，如果你的ffmpeg在编译时没有x264库，那么会报非法数据，因为ffmpeg编码264时，依赖x264进行编码。其它情况类似，排查这种问题可以根据这个输入文件或者输入流的音视频编码类型，然后再看ffmpeg支持的编解码器类型是否支持你想要输出的类型。
# 然后再配合ffmpeg的源码去判断，例如在ffmpeg源码中搜索"ffmpeg Invalid data found when processing input"这些关键错误信息。

# 压缩包密码破解
function compressed-cracking($compressedFilePath){
  echo $compressedFilePath
  # $fileName=$compressedFilePath.Name;
  # $fileName = [System.IO.Path]::GetFileNameWithoutExtension($compressedFilePath)
  # echo $fileName;
  # $fileSize = "$($compressedFilePath.Length) bytes";
  #echo $fileSize;
  # $fileExtension = (Split-Path -Path $compressedFilePath -Leaf).Split(".") ;
  $fileExtension = [System.IO.Path]::GetExtension($compressedFilePath);
  echo $fileExtension;
  switch($fileExtension) 
  {
      ".zip" {
      echo  "this is a .zip file" 
    }
        ".7z" {
      echo  "this is a .7z file" 
    }
    default { 
      echo  "this is a unknow file" 
    } 
  }
}


## amr2mp3
function amr2mp3($FilePath){
  echo "[INFO] amr_path=$FilePath";
  $fileName = [System.IO.Path]::GetFileNameWithoutExtension($FilePath);
  echo "[INFO] fileName=$fileName";
  $fileExtension = [System.IO.Path]::GetExtension($FilePath);
  echo "[INFO] fileExtension = $fileExtension ";
  switch($fileExtension) 
  {
      ".amr" {
      echo  "[INFO] this is a .amr file" 
                    $newFileName = $fileName+".mp3"
                    echo "[INFO] newfilename = $newFileName";
                    # 执行命令
                    ffmpeg -i $FilePath $newFileName
    }
        default {
      echo  "[INFO] this is not a .amr file" 
                    # $newFileName = $fileName+".mp3"
                    # echo "[INFO] newfilename = $newFileName";
    }
  }
}


  
# [如何在PowerShell中使用Echo命令 - 掘金](https://juejin.cn/post/7126782746004815879)
# [Powershell处理函数的参数 – PowerShell 中文博客](https://www.pstips.net/powershell-passing-arguments-to-functions.html#%E5%A4%9A%E4%B8%AA%E5%8F%82%E6%95%B0%E8%B0%83%E7%94%A8%E6%97%B6%EF%BC%9A)
# [​Windows系统使用powershell读取文件名等信息_powershell 文件名-CSDN博客](https://blog.csdn.net/weixin_56337147/article/details/133881034)